package futu

import "strconv"

/*
	输入两个整数a和b，输出他们相除的结果，如果有循环小数用括号表示。
	如：
			a=-1,b=2,输出"-0.5",
			a=1,b=3,输出"0.(3)",
			a=10,b=80,输出"0.125"
*/
func divide(a int, b int) string {
	// 例子：a = 1  , b =3
	// 如果除数为0，返回错误信息
	if b == 0 {
		return "Error: division by zero"
	}
	// 如果被除数为0，返回0
	if a == 0 {
		return "0"
	}
	// 记录结果的符号，如果异号为负，同号为正
	sign := ""
	if a * b < 0 {
		sign = "-"
	}
	// 取绝对值进行计算
	a = abs(a)
	b = abs(b)
	// 计算整数部分和余数
	quotient := a / b
	remainder := a % b
	// 例子：quotient = 0  , remainder = 1
	// 如果余数为0，直接返回整数部分
	if remainder == 0 {
		return sign + strconv.Itoa(quotient)
	}
	// 否则，用一个字典记录余数出现的位置，用一个字符串记录小数部分
	remainderDict := make(map[int]int)
	decimalStr := ""
	// 当余数不为0且没有出现循环时，继续计算
	for remainder != 0 && remainderDict[remainder] == 0 {
		// 1. 例子：remainder = 1  , remainderDict[remainder] == 0
		// 记录当前余数的位置
		remainderDict[remainder] = len(decimalStr) + 1
		// 1. remainderDict[remainder] == 0 + 1
		// 余数乘10再除以b，得到一个小数位
		remainder *= 10
		// 1. 例子：remainder = 10
		decimalStr += strconv.Itoa(remainder / b)
		// 1. 例子：decimalStr = 10/3 = "3"
		// 更新余数
		remainder %= b
	}
	// 如果余数为0，说明除尽了，直接返回结果
	if remainder == 0 {
		return sign + strconv.Itoa(quotient) + "." + decimalStr
		// 否则，说明出现了循环，找到循环节的起始位置，加上括号返回结果
	} else {
		start := remainderDict[remainder]
		return sign + strconv.Itoa(quotient) + "." + decimalStr[:start-1] + "(" + decimalStr[start-1:] + ")"
	}
}

// 求绝对值的辅助函数
func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}